package com.atguigu.edu.realtime.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @ClassName: DataFormatUtil
 * @Description: TODO 时间格式工具类
 * @Author: zhaoxunfeng
 * @Date: 2022-08-31 13:12
 * @Version: 1.0.0
 */
public class DateFormatUtil {

    private static final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private static final DateTimeFormatter dateTimeFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");


    /**
     * 将时间戳转换成 yyyy-MM-dd 格式的字符串
     *
     * @param ts 时间戳类型
     * @return
     */
    public static String toDateString(Long ts) {
        Date date = new Date(checkTimestampLength(ts));
        LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
        return dateFormat.format(dateTime);
    }

    /**
     * 将时间戳类型转换为 yyyyMMdd 格式的字符串
     * @param ts 时间戳类型
     * @return
     */
    public static String toPartitionDate(Long ts) {
        return toDateString(ts).replaceAll("-", "");
    }

    /**
     * 将时间戳转换成 yyyy-MM-dd HH:mm:ss格式的字符串
     *
     * @param ts 需要转换的时间戳
     * @return
     */
    public static String toDateTimeString(Long ts) {
        Date date = new Date(checkTimestampLength(ts));
        LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
        return dateTimeFormat.format(dateTime);
    }

    public static void main(String[] args) {
        Long ts = 1662005842L;

        System.out.println(toDateString(ts));
        System.out.println(minusDay("2022-08-31", 1));
        System.out.println(toDateTimeString(ts));
    }

    /**
     * 校验传入的时间戳长度
     * 如果时间戳只有10位,则末尾补充3个0
     *
     * @param ts 传入的时间戳
     * @return 返回13位长的时间戳
     */
    private static Long checkTimestampLength(Long ts) {
        String timestamp = String.valueOf(ts);
        if (timestamp.length() == 10) {
            timestamp = timestamp + "000";
        }
        return Long.parseLong(timestamp);
    }


    /**
     * 返回指定日期减去指定天数后的日期
     * e.g: 2021-03-21 - 1 = 2021-03-20
     *
     * @param date     yyyy-MM-dd 形式的时间字符串
     * @param minusNum 差值天数
     * @return
     */
    public static String minusDay(String date, int minusNum) {
        LocalDate localDate = LocalDate.parse(date, dateFormat).minusDays(minusNum);
        return dateFormat.format(localDate);
    }

    //"yyyy-MM-dd" -> ts(ms)
    public static Long dateStringToTs(String dateString) {
        try {
            return new SimpleDateFormat("yyyy-MM-dd").parse(dateString).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}
